UIViewController
视图控制器是我们在做开发过程进行视图和控件主要实现管理类,很多情况下我们都会与之打交道。
在整个 APP 运行期间也是每一个视图进行加载、展示和消除的过程。
UIViewController
周期
下图是 UIViewController
周期过程:
下面小编依次在 UIViewController
视图控制器中列出上面视图周期,然后进行跳转下一个界面看下操作的后 UIViewController
具体周期打印结果。
实现代码如下:
1 | - (void)viewDidLoad { |
执行上面的操作,然后点击按钮跳转下一个 UIViewController
视图控制器。打印出的结果如下:
1 | [58066:17044982] load Method: loadView |
上面并没有执行 viewWillUnload
和 viewDidUnload
,点开文档我们可以看到下面一段文字。
Called after the view controller’s view is released and set to nil. For example, a memory warning which causes the view to be purged. Not invoked as a result of -dealloc.
因为当前只有两个控制器,所以并没有调用 didReceiveMemoryWarning
。也就说当前视图控制器并没有销毁,还在内存中。
上面打印的结果很好验证小编所整理
UIViewController
在加载、展示和销毁过后过程执行。
loadView
、viewDidLoad
和 viewDidUnload
关系
在网上搜索一下关于 UIViewController
的周期问题,看到很多情况下问及 loadView
、viewDidLoad
和 viewDidUnload
三者之间的关系。
这里我们先了解下关于 App
展示的界面有哪些方式。
- 使用
XIB
来构建界面 - 使用
Storyboard
来构建界面 - 使用 代码来构建界面
界面构造
在构建界面过程中基本的流程是:
(1)系统会首先会加载 XIB
或者是 Storyboard
来初始化界面
(2)在没有 XIB
或者是 Storyboard
情况下加载手写代码实现界面
(3)在有 XIB
或者是 Storyboard
系统也会加载手写代码
XIB
来构建界面
下面来看下使用方式:
1 | UIViewController *viewController = [[UIViewController alloc] initWithNibName:@"name" bundle:nil]; |
上面使用 XIB
进行初始化过程需要指定 XIB
的名字和 bundle
的值。
Storyboard
来构建界面
下面来看下使用方式:
1 | UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"name" bundle:nil]; |
代码来构建界面
在上面我们所列举的 viewDidLoad
里面实现手写代码。
界面构建中 loadView
、viewDidLoad
和 viewDidUnload
调用
loadView
loadView
的使用时期一般是第一次加载界面(也即是:View不存在时)调用来对 view 进行加载,如果在函数中没有进行相关的调用系统会默认调用 [super loadView]
。
基本的内容是负责创建 UIViewController
中的 View
值。
其中 loadView
中大概执行加载情况如下:
(1)根据 XIB
或者是 Storyboard
来加载视图
1 | // XIB 加载视图 |
(2)如过没有相关的 XIB
或者 Storyboard
,使用 ViewController
初始化视图
1 | [[ViewController alloc] init]; |
(3)在没有 没有相关的 XIB
或者 Storyboard
时,最后初始化视图的View
1 | self.view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds]; |
viewDidLoad
上面三种创建 View 后均会提调用 viewDidLoad
,而且在其中我们可以实现对子控件的初始化。
viewDidUnload
如果当前的 App
占用过多的内存就会调用在函数周期的 didReceiveMemoryWarning
继而调用 viewDidUnload
释放当前的 UIViewControler
视图控制器。